/**
Filename: practica4a.c
Alumno: Jianpei Ye
Práctica: practica4a
Asignatura: Lab. SS.OO
**/
/*
Ejemplo: practica4a ls cat
*/
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <signal.h>

int main (int argc, char* argv[])
{
  int tuberia[2];
  int status;
  int ret;
  
  if (argc != 3)
  {
    perror ("Error en el número de parámetro de entrada.\n");
    exit (-1);
  }
  /* Creación de la tubería, antes de hacer el fork() */
  pipe (tuberia);
  
  if ((fork()) == 0) /* Código para el primer hijo */
  {
    /* Cerrar el lado de lectura del pipe */
    close(tuberia[0]);
    /* Asignar el extremo de salida de la tubería como 'Salida Estándar' */
    dup2(tuberia[1],1);
    close(tuberia[1]);
    /* Ejecutar el programa1 */
    ret = system(argv[1]);
    if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) exit(0);
    exit(status);
  }
  else if ((fork() )== 0) /* Código para el segundo hijo */
  {
    /* Cerra el lado de escritura del pipe */
    close (tuberia[1]);
    /* Asignar el extremo de entrada de la tubería como "Entrada Estándar */
    dup2(tuberia[0],0);
    close(tuberia[0]);
    ret = system(argv[2]);
    if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) exit(0);
    exit(status);
  }
  else /* Código para el proceso padre */
  {
    close(tuberia[0]);
    close(tuberia[1]);
    wait(&status);
    wait(&status);
    exit(0);
  }
  return 0;
}
